package com.hww.common.util;

import android.content.Context;
import android.content.SharedPreferences;

public class SharePreferencesUtils {

    public static String PREFERENCE_NAME = "hww";


    /**
     * 存储字符串
     */
    public static boolean putString(Context context, String key, String value) {
        SharedPreferences preferences = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = preferences.edit();
        editor.putString(key, value);
        return editor.commit();
    }

    /**
     * 读取字符串
     */
    public static String getString(Context context, String key) {
        return getString(context, key, "");
    }

    /**
     * 读取字符串（带默认值的）
     */
    public static String getString(Context context, String key, String defaultValue) {
        SharedPreferences preferences = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE);
        return preferences.getString(key, defaultValue);
    }


    /**
     * 存储int类型数据
     */
    public static boolean putInt(Context context, String key, int value) {
        SharedPreferences preferences = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = preferences.edit();
        editor.putInt(key, value);
        return editor.commit();
    }

    /**
     * 读取int类型数据
     */
    public static int getInt(Context context, String key) {
        return getInt(context, key, -1);
    }

    /**
     * 读取int类型数据（带默认值的）
     */
    public static int getInt(Context context, String key, int defaultValue) {
        SharedPreferences preferences = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE);
        return preferences.getInt(key, defaultValue);
    }

    /**
     * 存储boolean类型数据
     */
    public static boolean putBoolean(Context context, String key, boolean value) {
        SharedPreferences preferences = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = preferences.edit();
        editor.putBoolean(key, value);
        return editor.commit();
    }

    /**
     * 读取boolean类型数据
     */
    public static boolean getBoolean(Context context, String key) {
        return getBoolean(context, key, false);
    }

    /**
     * 读取boolean类型数据（带默认值的）
     */
    public static boolean getBoolean(Context context, String key, boolean defaultValue) {
        SharedPreferences preferences = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE);
        return preferences.getBoolean(key, defaultValue);
    }

    /**
     * 清除数据
     */
    private static boolean clearPreferences(Context context) {
        SharedPreferences pref = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = pref.edit();
        editor.clear();
        return editor.commit();
    }

    /**
     * 将给定的键值对存储到SharedPreferences中。
     * 该方法支持存储字符串、整数、布尔值、浮点数和长整型数据。对于不支持的数据类型，
     * 将其转换为字符串后存储。
     *
     * @param context 应用程序上下文，用于获取SharedPreferences实例。
     * @param key     要存储的数据的键。
     * @param value   要存储的数据的值。
     * @return 如果存储操作成功，则返回true；否则返回false。
     */
    public static boolean put(Context context, String key, Object value) {
        SharedPreferences pref = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = pref.edit();
        if (value instanceof String) {
            editor.putString(key, (String) value);
        } else if (value instanceof Integer) {
            editor.putInt(key, (Integer) value);
        } else if (value instanceof Boolean) {
            editor.putBoolean(key, (Boolean) value);
        } else if (value instanceof Float) {
            editor.putFloat(key, (Float) value);
        } else if (value instanceof Long) {
            editor.putLong(key, (Long) value);
        } else {
            editor.putString(key, value.toString());
        }
        return editor.commit();
    }

    /**
     * 从SharedPreferences中获取缓存数据。
     * 这个方法支持多种数据类型的获取，通过判断defaultObject的类型来决定获取哪种类型的数据。
     *
     * @param context       上下文对象，用于获取SharedPreferences实例。
     * @param key           要获取数据的键。
     * @param defaultObject 一个默认值对象，用于指定当键不存在时返回的值的类型及其默认值。
     * @return 缓存中的数据，如果键不存在且defaultObject为非null，则返回defaultObject的类型对应的默认值；如果defaultObject为null，则返回null。
     */
    public static Object get(Context context, String key, Object defaultObject) {
        SharedPreferences pref = context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE);
        if (defaultObject instanceof String) {
            return pref.getString(key, (String) defaultObject);
        } else if (defaultObject instanceof Integer) {
            return pref.getInt(key, (int) defaultObject);
        } else if (defaultObject instanceof Boolean) {
            return pref.getBoolean(key, (boolean) defaultObject);
        } else if (defaultObject instanceof Float) {
            return pref.getFloat(key, (float) defaultObject);
        } else if (defaultObject instanceof Long) {
            return pref.getLong(key, (long) defaultObject);
        }
        return null;
    }
}